[PR]

水無瀬の部屋 > Programming > sample > atlnk > custom.cpp
最終更新日: 2007/03/29

   1: //*********************************************************
   2: // プロジェクト: atlnk - @link.target
   3: //   ファイル名: custom.cpp
   4: //*********************************************************
   5: #include "custom.h"  //
   6: #include "cmdline.h" //
   7: #include "info.h"    //
   8: #include "res.h"     //
   9: #include <relation/relation.h> //
  10: #include <misc/atoffset.h>
  11: #include <header/myweburl.h>       //
  12: #include <dlg/aboutbox/aboutbox.h> //
  13: 
  14: 
  15: //---------------------------------------------------------
  16: // テスト関数 の 宣言
  17: //---------------------------------------------------------
  18: DECLARE_TESTPROC( test_InstallDlg );
  19: 
  20: 
  21: //---------------------------------------------------------
  22: // マクロ定数 の 定義
  23: //---------------------------------------------------------
  24: //
  25: #define REG_CLS_FOLDER       ( "folder" )
  26: #define REG_KEYNAME_COMMAND  ( "command" )
  27: //
  28: #define COLUMN_VERB           ( 0 )
  29: #define COLUMN_CMDLINE        ( 1 )
  30: #define COLUMN_WIDTH_VERB     ( 60 )
  31: #define COLUMN_WIDTH_CMDLINE  ( 256 )
  32: #define COLUMN_TITLE_VERB     ( "verb" )
  33: #define COLUMN_TITLE_CMDLINE  ( "cmdline" )
  34: 
  35: 
  36: //---------------------------------------------------------
  37: // ファイルスコープ関数 の 宣言
  38: //---------------------------------------------------------
  39: static bool InitInstallDlgControls( HWND hWnd, DWORD more );
  40: static bool SetInstallDlgData( HWND hWnd, const install_t *info );
  41: static bool GetInstallDlgData( HWND hWnd, install_t *info );
  42: static bool EnableDlgItemGroup( HWND hWnd, id_t id, bool bEnable );
  43: static bool ShowDlgItemGroup( HWND hWnd, id_t id, bool bShow );
  44: static int  ListView_GetNextSelectedItem( HWND hwndListView, int index );
  45: static bool InitInstallDlgSystemMenu( HWND hWnd );
  46: static INT_PTR CALLBACK InstallDlgProc( HWND, UINT, WPARAM, LPARAM );
  47: 
  48: 
  49: //---------------------------------------------------------
  50: // ファイルスコープ変数 の 定義
  51: //---------------------------------------------------------
  52: //
  53: static struct g_dlg_tag
  54: 	{
  55: 		bool      pif;
  56: 		DWORD     more;
  57: 		RECT      rcClient;
  58: 		SIZE      szMinSize;
  59: 		install_t info;
  60: 	} g_dlg;
  61: 
  62: //
  63: static const struct g_ddx_tag
  64: 	{
  65: 		id_t  id;
  66: 		DWORD flag;
  67: 		int   check;
  68: 		int   more;
  69: 		int   reg;
  70: 		int   reg_title;
  71: 		int   menu;
  72: 		int   menu_title;
  73: 		int   cmdline;
  74: 		int   cmdline_title;
  75: 		int   list;
  76: 		int   list_title;
  77: 		int   group;
  78: 	}
  79: g_ddx[] = 
  80: 	{
  81: #define MAKE_DDX( name ) { ID_ ## name, FLAG_ ## name, IDC_ ## name, IDC_MORE_ ## name, IDC_REGPATH_ ## name, IDC_STATIC_REGPATH_ ## name, IDC_MENUTITLE_ ## name, IDC_STATIC_MENUTITLE_ ## name, IDC_CMDLINE_ ## name, IDC_STATIC_CMDLINE_ ## name, IDC_VERBLIST_ ## name, IDC_STATIC_VERBLIST_ ## name, IDC_GROUP_ ## name }
  82: 		MAKE_DDX( LNK ),
  83: 		MAKE_DDX( PIF ),
  84: #undef MAKE_DDX
  85: 	};
  86: COMPILE_ASSERT( numof(g_ddx) == numof( ((install_t *)null)->reg ) );
  87: 
  88: // 各コントロールIDへのアクセス
  89: static const size_t g_offset[] =
  90: 	{
  91: #define DDX_MEMBER_OFFSET( member ) offsetof( struct g_ddx_tag, member )
  92: 		DDX_MEMBER_OFFSET( check ), 
  93: 		DDX_MEMBER_OFFSET( more ),
  94: 		DDX_MEMBER_OFFSET( reg ),
  95: 		DDX_MEMBER_OFFSET( reg_title ),
  96: 		DDX_MEMBER_OFFSET( menu ),
  97: 		DDX_MEMBER_OFFSET( menu_title ),
  98: 		DDX_MEMBER_OFFSET( cmdline ),
  99: 		DDX_MEMBER_OFFSET( cmdline_title ),
 100: 		DDX_MEMBER_OFFSET( list ),
 101: 		DDX_MEMBER_OFFSET( list_title ),
 102: 		DDX_MEMBER_OFFSET( group ),
 103: #undef DDX_MEMBER_OFFSET
 104: 	};
 105: 
 106: 
 107: //*********************************************************
 108: // InstallDlg
 109: // アプリケーションを拡張子に関連づける
 110: //*********************************************************
 111: bool
 112: InstallDlg
 113: 	(
 114: 		HWND hwndOwner
 115: 	)
 116: {
 117: 	CALLONCE_TESTPROC( test_InstallDlg ); // [テスト]
 118: 
 119: 	// パラメタの仮定
 120: 	ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
 121: 
 122: 	HINSTANCE hInstance = GetModuleHandle( null );
 123: 	const INT_PTR result = DialogBoxParam
 124: 		(
 125: 			hInstance,
 126: 			MAKEINTRESOURCE( INSTALL_BOX ),
 127: 			hwndOwner, 
 128: 			InstallDlgProc,
 129: 			null
 130: 		);
 131: 	return IDOK == result;
 132: }//InstallDlg
 133: 
 134: 
 135: //******************************************************************************************************************
 136: //
 137: //******************************************************************************************************************
 138: static INT_PTR OnInstallInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam );
 139: static INT_PTR OnInstallDestroy( HWND hWnd );
 140: static INT_PTR OnInstallCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
 141: static INT_PTR OnInstallSystemCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
 142: static INT_PTR OnInstallInitMenuPopup( HWND hWnd, WPARAM wParam, LPARAM lParam );
 143: static INT_PTR OnInstallHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
 144: static INT_PTR OnInstallGetMinMaxInfo( HWND hWnd, LPARAM lParam );
 145: static INT_PTR OnInstallSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
 146: static INT_PTR OnInstallNotify( HWND hWnd, WPARAM wParam, LPARAM lParam );
 147: 
 148: 
 149: //*********************************************************
 150: // InstallDlgProc
 151: //*********************************************************
 152: static
 153: INT_PTR
 154: CALLBACK
 155: InstallDlgProc
 156: 	(
 157: 		HWND   hWnd,
 158: 		UINT   uMsg,
 159: 		WPARAM wParam,
 160: 		LPARAM lParam
 161: 	)
 162: {
 163: 	// パラメタの仮定
 164: 	ASSERT( IsValidWindow( hWnd ) );
 165: 
 166: 	switch( uMsg )
 167: 	{
 168: 		case WM_DESTROY:       return OnInstallDestroy( hWnd );
 169: 		case WM_NCHITTEST:     return OnInstallHitTest( hWnd, wParam, lParam );
 170: 		case WM_INITDIALOG:    return OnInstallInitDialog( hWnd, wParam, lParam );
 171: 		case WM_COMMAND:       return OnInstallCommand( hWnd, wParam, lParam );
 172: 		case WM_SYSCOMMAND:    return OnInstallSystemCommand( hWnd, wParam, lParam );
 173: 		case WM_NOTIFY:        return OnInstallNotify( hWnd, wParam, lParam );
 174: 		case WM_GETMINMAXINFO: return OnInstallGetMinMaxInfo( hWnd, lParam );
 175: 		case WM_SIZE:          return OnInstallSize( hWnd, wParam, lParam );
 176: 		case WM_INITMENUPOPUP: return OnInstallInitMenuPopup( hWnd, wParam, lParam );
 177: 		default:               return false;
 178: 	}
 179: }//InstallDlgProc
 180: 
 181: //*********************************************************
 182: // OnInstallInitDialog - WM_INITDIALOG
 183: // ダイアログが作成された。
 184: // この関数が抜けるまでダイアログは表示されない。
 185: // 明示的にフォーカスを移動した場合は 真 を返せ。
 186: // さもなくば 偽 を返せ。
 187: //   HWND   wParam …… フォーカスを受け取る予定のコントロール
 188: //   LPARAM lParam …… ダイアログの初期化パラメタ
 189: //*********************************************************
 190: static
 191: INT_PTR
 192: OnInstallInitDialog
 193: 	(
 194: 		HWND   hWnd,
 195: 		WPARAM _unuse( wParam ),
 196: 		LPARAM _unuse( lParam )
 197: 	)
 198: {
 199: 	// パラメタの仮定
 200: 	ASSERT( IsValidWindow( hWnd ) );
 201: 	ASSERT( IsValidInitDialogMessageParam( wParam, lParam ) );
 202: 
 203: 	// ダイアログ の 初期化
 204: 	{
 205: 		HINSTANCE hInstance = GetModuleHandle( null );
 206: 		HICON hIcon   = SHGetInstanceIcon( hInstance, SHGFI_LARGEICON );
 207: 		HICON hIconSm = SHGetInstanceIcon( hInstance, SHGFI_SMALLICON );
 208: 		SetWindowIcon( hWnd, ICON_BIG,   hIcon   ); // 大きいアイコン
 209: 		SetWindowIcon( hWnd, ICON_SMALL, hIconSm ); // 小さいアイコン
 210: 		VERIFY( WindowMoveToCursorPos( hWnd ) );
 211: 
 212: 		// ダイアログ情報 g_dlg の 初期化
 213: 		{
 214: 			//
 215: 			VERIFY( GetClientRect( hWnd, &g_dlg.rcClient ) );
 216: 			VERIFY( GetWindowSize( hWnd, &g_dlg.szMinSize ) );
 217: 			
 218: 			//
 219: 			VERIFY( LoadInstallInfo( &g_dlg.info ) );
 220: 
 221: 			// 全ての詳細を隠す
 222: 			g_dlg.more = 0;
 223: 
 224: 			// 
 225: 			g_dlg.pif = (FLAG_PIF == (FLAG_PIF & g_dlg.info.flags)); 
 226: 		}
 227: 	}
 228: 
 229: 	// システムメニュー の 初期化
 230: 	VERIFY( InitInstallDlgSystemMenu( hWnd ) );
 231: 
 232: 	// コントロール の 初期化
 233: 	VERIFY( InitInstallDlgControls( hWnd, g_dlg.more ) );
 234: 
 235: 	// コントロール値 の 設定
 236: 	VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
 237: 
 238: 	return false;
 239: }//OnInstallInitDialog
 240: 
 241: //*********************************************************
 242: // OnInstallDestroy - WM_DESTROY
 243: // まもなくウィンドウが破棄される。
 244: // ウィンドウに関連付けた独自リソースを破棄する。
 245: // 常に 真 を返す。
 246: //*********************************************************
 247: static
 248: INT_PTR
 249: OnInstallDestroy
 250: 	(
 251: 		HWND _unuse( hWnd )
 252: 	)
 253: {
 254: 	// パラメタの仮定
 255: 	ASSERT( IsValidWindow( hWnd ) );
 256: 
 257: 	return true;
 258: }//OnInstallDestroy
 259: 
 260: //*********************************************************
 261: // OnInstallHitTest - WM_NCHITTEST
 262: // カーソル・イベントがあるたびに呼び出される。
 263: // カーソルが存在する位置を示す値を返す。
 264: //   GET_X_LPARAM( lParam ) …… カーソルのスクリーン x 座標
 265: //   GET_Y_LPARAM( lParam ) …… カーソルのスクリーン y 座標
 266: //*********************************************************
 267: static
 268: INT_PTR
 269: OnInstallHitTest
 270: 	(
 271: 		HWND   hWnd,
 272: 		WPARAM wParam, 
 273: 		LPARAM lParam
 274: 	)
 275: {
 276: 	// パラメタの仮定
 277: 	ASSERT( IsValidWindow( hWnd ) );
 278: 
 279: 	// サイズ変更矢印の変換ルール一覧
 280: 	const struct { LRESULT from; LRESULT to; } trans[] = 
 281: 		{
 282: 			{ HTCLIENT,      HTCAPTION }, // クライアント領域を掴んで移動可能に
 283: 			{ HTTOP,         HTBORDER  }, // 上端の縦矢印 → 矢印なし
 284: 			{ HTBOTTOM,      HTBORDER  }, // 下端の縦矢印 → 矢印なし
 285: 			{ HTTOPLEFT,     HTLEFT    }, // 左上隅の斜め矢印 → 左右矢印
 286: 			{ HTTOPRIGHT,    HTRIGHT   }, // 右上隅の斜め矢印 → 左右矢印
 287: 			{ HTBOTTOMLEFT,  HTLEFT    }, // 左下隅の斜め矢印 → 左右矢印
 288: 			{ HTBOTTOMRIGHT, HTRIGHT   }, // 右下隅の斜め矢印 → 左右矢印
 289: 		};
 290: 	// 変換一覧にあれば変換した値を返す
 291: 	const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
 292: 	{for( int i = 0; i < numof( trans ); ++i )
 293: 	{
 294: 		if ( lResult == trans[ i ].from )
 295: 		{
 296: 			SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
 297: 			return true;
 298: 		}
 299: 	}}
 300: 
 301: 	return false;
 302: }//OnInstallHitTest
 303: 
 304: //*********************************************************
 305: // OnInstallInitMenuPopup - WM_INITMENUPOPUP
 306: // ポップアップ・メニューがアクティブになる。
 307: //   HMENU wParam         …… メニューへのハンドル
 308: //   UINT  LOWORD(lParam) …… 親メニュー座標での 0 からの相対位置
 309: //   bool  HIWORD(lParam) …… システムメニューであれば 真 
 310: //*********************************************************
 311: static
 312: INT_PTR
 313: OnInstallInitMenuPopup
 314: 	(
 315: 		HWND   hWnd,
 316: 		WPARAM wParam,
 317: 		LPARAM _unuse( lParam )
 318: 	)
 319: {
 320: 	// パラメタの仮定
 321: 	ASSERT( IsValidWindow( hWnd ) );
 322: 	ASSERT( IsValidInitMenuPopupMessageParam( wParam, lParam ) );
 323: 
 324: 	// メニュー
 325: 	HMENU hmenuPopup = reinterpret_cast<HMENU>( wParam );
 326: 	Menu_CheckItem( hmenuPopup, IDM_USE_PIF, MF_BYCOMMAND, g_dlg.pif );
 327: 
 328: 	return true;
 329: }//OnInstallInitMenuPopup
 330: 
 331: //*********************************************************
 332: // OnInstallGetMinMaxInfo
 333: //*********************************************************
 334: static
 335: INT_PTR
 336: OnInstallGetMinMaxInfo
 337: 	(
 338: 		HWND   hWnd,
 339: 		LPARAM lParam
 340: 	)
 341: {
 342: 	// パラメタの仮定
 343: 	ASSERT( IsValidWindow( hWnd ) );
 344: 	ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
 345: 
 346: 	//
 347: 	MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
 348: 
 349: 	//
 350: 	pmmi->ptMinTrackSize.y = g_dlg.szMinSize.cy;
 351: 	pmmi->ptMaxTrackSize.y = g_dlg.szMinSize.cy;
 352: 
 353: 	//
 354: 	pmmi->ptMinTrackSize.x = ((0 != g_dlg.more) ? 2 : 1) * g_dlg.szMinSize.cx;
 355: 
 356: 	//
 357: 	if ( 0 == g_dlg.more )
 358: 	{
 359: 		pmmi->ptMaxTrackSize.x = g_dlg.szMinSize.cx;
 360: 	}
 361: 
 362: 	return true;
 363: }//OnInstallGetMinMaxInfo
 364: 
 365: //*********************************************************
 366: // OnInstallSize
 367: //*********************************************************
 368: static
 369: INT_PTR
 370: OnInstallSize
 371: 	(
 372: 		HWND   hWnd,
 373: 		WPARAM wParam,
 374: 		LPARAM lParam
 375: 	)
 376: {
 377: 	// パラメタの仮定
 378: 	ASSERT( IsValidWindow( hWnd ) );
 379: 
 380: 	// 最小化時は無視
 381: 	if ( SIZE_MINIMIZED == wParam )
 382: 		return true;
 383: 
 384: 	// 移動とサイズ変更のリスト
 385: 	const struct
 386: 		{
 387: 			int  nID;
 388: 			bool pos_x;
 389: 			bool pos_y;
 390: 			bool size_x;
 391: 			bool size_y;
 392: 		}
 393: 	ctrl[] =
 394: 		{
 395: //			{ IDC_LNK,           false, false, false, false  },
 396: 			{ IDC_MORE_LNK,      true,  false, false, false  },
 397: 			{ IDC_REGPATH_LNK,   false, false, true,  false  },
 398: 			{ IDC_MENUTITLE_LNK, false, false, true,  false  },
 399: 			{ IDC_CMDLINE_LNK,   false, false, true,  false  },
 400: 			{ IDC_VERBLIST_LNK,  false, false, true,  false  },
 401: 			{ IDC_GROUP_LNK,     false, false, true,  false  },
 402: //			{ IDC_PIF,           false, false, false, false  },
 403: 			{ IDC_MORE_PIF,      true,  false, false, false  },
 404: 			{ IDC_REGPATH_PIF,   false, false, true,  false  },
 405: 			{ IDC_MENUTITLE_PIF, false, false, true,  false  },
 406: 			{ IDC_CMDLINE_PIF,   false, false, true,  false  },
 407: 			{ IDC_VERBLIST_PIF,  false, false, true,  false  },
 408: 			{ IDC_GROUP_PIF,     false, false, true,  false  },
 409: 			{ IDOK,              true,  false, false, false  },
 410: 			{ IDCANCEL,          true,  false, false, false  }
 411: 		};
 412: 	HDWP hdwp = BeginDeferWindowPos( numof(ctrl) );
 413: 	if ( hdwp )
 414: 	{
 415: 		const int width   = LOWORD(lParam);
 416: 		const int height  = HIWORD(lParam);
 417: 		const int shift_x = width  - g_dlg.rcClient.right;
 418: 		const int shift_y = height - g_dlg.rcClient.bottom;
 419: 		{for( int i = 0; i < numof(ctrl); ++i )
 420: 		{
 421: 			ASSERT( IsValidDlgItem( hWnd, ctrl[ i ].nID ) );
 422: 			VERIFY( ShiftDeferDlgItem
 423: 				(
 424: 					&hdwp,
 425: 					hWnd,
 426: 					ctrl[i].nID,
 427: 					ctrl[i].pos_x  ? shift_x : 0,
 428: 					ctrl[i].pos_y  ? shift_y : 0,
 429: 					ctrl[i].size_x ? shift_x : 0,
 430: 					ctrl[i].size_y ? shift_y : 0
 431: 				) );
 432: 		}}
 433: 		VERIFY( EndDeferWindowPos( hdwp ) );
 434: 
 435: 		g_dlg.rcClient.right  = width;
 436: 		g_dlg.rcClient.bottom = height;
 437: 	}
 438: 	return true;
 439: }//OnInstallSize
 440: 
 441: 
 442: //******************************************************************************************************************
 443: // OnInstallCommand - WM_COMMAND
 444: //******************************************************************************************************************
 445: static INT_PTR OnInstallCommandOK( HWND hWnd );
 446: static INT_PTR OnInstallCommandCancel( HWND hWnd );
 447: static INT_PTR OnInstallCommandDefault( HWND hWnd, WPARAM wParam );
 448: static INT_PTR OnInstallCommandCheck( HWND hWnd, WPARAM wParam );
 449: static INT_PTR OnInstallCommandMore( HWND hWnd, WPARAM wParam );
 450: 
 451: 
 452: //*********************************************************
 453: // OnInstallCommand - WM_COMMAND
 454: // コマンド項目が選択された。
 455: // 返値の意味は要求されたコマンド項目による。
 456: //   LOWORD(wParam) …… 選択されたコマンド項目の識別子。
 457: //                     メニューの区切り線が選択された場合は 0 が設定される。
 458: //   HIWORD(wParam) …… 通知コード。
 459: //                     メッセージが  メニュー  から送信された場合は 0 が設定される。
 460: //                     メッセージがアクセラレータから送信された場合は 1 が設定される。
 461: //   HWND lParam    …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
 462: //
 463: //*********************************************************
 464: static
 465: INT_PTR
 466: OnInstallCommand
 467: 	(
 468: 		HWND   hWnd,
 469: 		WPARAM wParam,
 470: 		LPARAM _unuse( lParam )
 471: 	)
 472: {
 473: 	// パラメタの仮定
 474: 	ASSERT( IsValidWindow( hWnd ) );
 475: 	ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
 476: 
 477: 	switch( LOWORD( wParam ) )
 478: 	{
 479: 		case IDOK:     return OnInstallCommandOK( hWnd );
 480: 		case IDCANCEL: return OnInstallCommandCancel( hWnd );
 481: 		default:       return OnInstallCommandDefault( hWnd, wParam );
 482: 	}
 483: }//OnInstallCommand
 484: 
 485: //*********************************************************
 486: // OnInstallCommandOK
 487: //*********************************************************
 488: static
 489: INT_PTR
 490: OnInstallCommandOK
 491: 	(
 492: 		HWND hWnd
 493: 	)
 494: {
 495: 	// パラメタの仮定
 496: 	ASSERT( IsValidWindow( hWnd ) );
 497: 
 498: 	//
 499: 	install_t info; // 設定値
 500: 	if ( ! GetInstallDlgData( hWnd, &info ) )
 501: 	{
 502: 		return false;
 503: 	}
 504: 	ASSERT( IsValidInstallInfo( &info ) );
 505: 
 506: 	// 関連づけ
 507: 	const DWORD modified = GetModifiedFlags( &info, &g_dlg.info );
 508: 	VERIFY( SaveInstallInfo( &info, modified ) );
 509: 
 510: 	//
 511: 	VERIFY( EndDialog( hWnd, IDOK ) );
 512: 
 513: 	return true;
 514: }//OnInstallCommandOK
 515: 
 516: //*********************************************************
 517: // OnInstallCommandCancel
 518: //*********************************************************
 519: static
 520: INT_PTR
 521: OnInstallCommandCancel
 522: 	(
 523: 		HWND hWnd
 524: 	)
 525: {
 526: 	// パラメタの仮定
 527: 	ASSERT( IsValidWindow( hWnd ) );	
 528: 	
 529: 	VERIFY( EndDialog( hWnd, IDCANCEL ) );
 530: 
 531: 	return true;
 532: }//OnInstallCommandCancel
 533: 
 534: //*********************************************************
 535: // OnInstallCommandDefault
 536: //*********************************************************
 537: static
 538: INT_PTR
 539: OnInstallCommandDefault
 540: 	(
 541: 		HWND   hWnd,
 542: 		WPARAM wParam
 543: 	)
 544: {
 545: 	// パラメタの仮定
 546: 	ASSERT( IsValidWindow( hWnd ) );
 547: 
 548: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 549: 	{
 550: 		const int id = LOWORD( wParam );
 551: 
 552: 		if ( id == g_ddx[ i ].check )
 553: 			return OnInstallCommandCheck( hWnd, wParam );
 554: 		if ( id == g_ddx[ i ].more )
 555: 			return OnInstallCommandMore( hWnd, wParam );
 556: 	}}
 557: 
 558: 	return false;
 559: }//OnInstallCommandDefault
 560: 
 561: //*********************************************************
 562: // OnInstallCommandCheck
 563: //*********************************************************
 564: static
 565: INT_PTR
 566: OnInstallCommandCheck
 567: 	(
 568: 		HWND   hWnd,
 569: 		WPARAM wParam
 570: 	)
 571: {
 572: 	// パラメタの仮定
 573: 	ASSERT( IsValidWindow( hWnd ) );
 574: 
 575: 	//
 576: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 577: 	{
 578: 		if ( g_ddx[ i ].check == LOWORD( wParam ) )
 579: 		{
 580: 			const bool bEnable = (BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ));
 581: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, bEnable );
 582: 			return true;
 583: 		}
 584: 	}}
 585: 
 586: 	UNREACHCODE( "g_ddx の抜け?" );
 587: 	return true;
 588: }//OnInstallCommandCheck
 589: 
 590: //*********************************************************
 591: // OnInstallCommandMore
 592: //*********************************************************
 593: static
 594: INT_PTR
 595: OnInstallCommandMore
 596: 	(
 597: 		HWND   hWnd,
 598: 		WPARAM wParam
 599: 	)
 600: {
 601: 	// パラメタの仮定
 602: 	ASSERT( IsValidWindow( hWnd ) );
 603: 
 604: 	//
 605: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 606: 	{
 607: 		if ( g_ddx[ i ].more == LOWORD( wParam ) )
 608: 		{
 609: 			g_dlg.more ^= g_ddx[ i ].flag;
 610: 			VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (g_dlg.more & g_ddx[ i ].flag) ) );
 611: 			return true;
 612: 		}
 613: 	}}
 614: 
 615: 	UNREACHCODE( "g_ddx の抜け?" );
 616: 	return true;
 617: }//OnInstallCommandMore
 618: 
 619: 
 620: //******************************************************************************************************************
 621: // WM_SYSCOMMAND
 622: //******************************************************************************************************************
 623: static INT_PTR OnInstallSystemCommandSetDefault( HWND hWnd );
 624: static INT_PTR OnInstallSystemCommandAbout( HWND hWnd );
 625: static INT_PTR OnInstallSystemCommandUsePif( HWND hWnd );
 626: 
 627: 
 628: //*********************************************************
 629: // OnInstallSystemCommand - WM_SYSCOMMAND
 630: //*********************************************************
 631: static
 632: INT_PTR
 633: OnInstallSystemCommand
 634: 	(
 635: 		HWND   hWnd,
 636: 		WPARAM wParam,
 637: 		LPARAM _unuse( lParam )
 638: 	)
 639: {
 640: 	// パラメタの仮定
 641: 	ASSERT( IsValidWindow( hWnd ) );
 642: 	ASSERT( IsValidSystemCommandMessageParam( wParam, lParam ) );
 643: 
 644: 	switch( LOWORD(wParam) )
 645: 	{
 646: 		case IDM_ABOUT:      return OnInstallSystemCommandAbout( hWnd );
 647: 		case IDM_SETDEFAULT: return OnInstallSystemCommandSetDefault( hWnd );
 648: 		case IDM_USE_PIF:    return OnInstallSystemCommandUsePif( hWnd );
 649: 		default:             return false;
 650: 	}
 651: }//OnInstallSystemCommand
 652: 
 653: //*********************************************************
 654: // OnInstallSystemCommandAbout
 655: //*********************************************************
 656: static
 657: INT_PTR
 658: OnInstallSystemCommandAbout
 659: 	(
 660: 		HWND hWnd
 661: 	)
 662: {
 663: 	// パラメタの仮定
 664: 	ASSERT( IsValidWindow( hWnd ) );
 665: 
 666: 	ABOUTBOX_t tmp; // AboutBox のパラメータ
 667: 	tmp.url = URL_WEBPAGE;
 668: 	AboutBox( hWnd, &tmp ); // 「……について」ダイアログを表示する。
 669: 
 670: 	return true;
 671: }//OnInstallSystemCommandAbout
 672: 
 673: //*********************************************************
 674: // OnInstallSystemCommandSetDefault
 675: //*********************************************************
 676: static
 677: INT_PTR
 678: OnInstallSystemCommandSetDefault
 679: 	(
 680: 		HWND hWnd
 681: 	)
 682: {
 683: 	// パラメタの仮定
 684: 	ASSERT( IsValidWindow( hWnd ) );
 685: 
 686: 	VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
 687: 
 688: 	//
 689: 	g_dlg.pif = (FLAG_PIF == (FLAG_PIF & g_dlg.info.flags)); 
 690: 
 691: 	// OnInstallSystemCommandUsePif(), InitInstallDlgControls() と重複している!
 692: 	// 関数名を考えよう!
 693: 	if ( g_dlg.pif )
 694: 	{
 695: 		VisibleDlgItem( hWnd, IDC_PIF,      true );
 696: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
 697: 	}
 698: 	else
 699: 	{
 700: 		VisibleDlgItem( hWnd, IDC_PIF,      false );
 701: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
 702: 
 703: 		if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
 704: 		{
 705: 			g_dlg.more ^= FLAG_PIF;
 706: 			VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
 707: 		}
 708: 	}
 709: 
 710: 	return true;
 711: }//OnInstallSystemCommandSetDefault
 712: 
 713: //*********************************************************
 714: // OnInstallSystemCommandUsePif
 715: //*********************************************************
 716: static
 717: INT_PTR
 718: OnInstallSystemCommandUsePif
 719: 	(
 720: 		HWND hWnd
 721: 	)
 722: {
 723: 	// パラメタの仮定
 724: 	ASSERT( IsValidWindow( hWnd ) );
 725: 
 726: 	//
 727: 	g_dlg.pif = !g_dlg.pif;
 728: 
 729: 	// InitInstallDlgControls(), OnInstallSystemCommandSetDefault() と重複している!
 730: 	// 関数名を考えよう!
 731: 	if ( g_dlg.pif )
 732: 	{
 733: 		VisibleDlgItem( hWnd, IDC_PIF,      true );
 734: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
 735: 	}
 736: 	else
 737: 	{
 738: 		VisibleDlgItem( hWnd, IDC_PIF,      false );
 739: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
 740: 
 741: 		if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
 742: 		{
 743: 			g_dlg.more ^= FLAG_PIF;
 744: 			VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
 745: 		}
 746: 	}
 747: 
 748: 	return true;
 749: }//OnInstallSystemCommandUsePif
 750: 
 751: 
 752: //******************************************************************************************************************
 753: // OnInstallNotify - WM_NOTIFY
 754: //******************************************************************************************************************
 755: static INT_PTR OnInstallNotifyVerbList( HWND hWnd, LPARAM lParam );
 756: static INT_PTR OnInstallNotifyVerbListDubleClick( HWND hWnd, LPARAM lParam );
 757: 
 758: 
 759: //*********************************************************
 760: // OnInstallNotify 
 761: //*********************************************************
 762: static
 763: INT_PTR
 764: OnInstallNotify
 765: 	(
 766: 		HWND   hWnd,
 767: 		WPARAM wParam,
 768: 		LPARAM lParam
 769: 	)
 770: {
 771: 	// パラメタの仮定
 772: 	ASSERT( IsValidWindow( hWnd ) );
 773: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
 774: 
 775: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 776: 	{
 777: 		if ( g_ddx[ i ].list == static_cast<int>( wParam ) )
 778: 			return OnInstallNotifyVerbList( hWnd, lParam );
 779: 	}}
 780: 
 781: 	return false;
 782: }//OnInstallNotify
 783: 
 784: //*********************************************************
 785: // OnInstallNotifyVerbList 
 786: //*********************************************************
 787: static 
 788: INT_PTR
 789: OnInstallNotifyVerbList
 790: 	(
 791: 		HWND   hWnd,
 792: 		LPARAM lParam
 793: 	)
 794: {
 795: 	// パラメタの仮定
 796: 	ASSERT( IsValidWindow( hWnd ) );
 797: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
 798: 	ASSERT( IsWindowListViewControl( ((NMHDR *)lParam)->hwndFrom ) );
 799: 
 800: 	const NMHDR *nmh = (NMHDR *)lParam; 
 801: 	switch( nmh->code )
 802: 	{
 803: 		case NM_DBLCLK:  return OnInstallNotifyVerbListDubleClick( hWnd, lParam );
 804: 		default:         return false;
 805: 	}
 806: }//OnInstallNotifyVerbList
 807: 
 808: //*********************************************************
 809: // OnInstallNotifyVerbListDubleClick
 810: //*********************************************************
 811: static
 812: INT_PTR
 813: OnInstallNotifyVerbListDubleClick
 814: 	(
 815: 		HWND   hWnd,
 816: 		LPARAM lParam
 817: 	)
 818: {
 819: 	// パラメタの仮定
 820: 	ASSERT( IsValidWindow( hWnd ) );
 821: 	ASSERT( IsValidPtr( (NMHDR *)lParam, sizeof(NMHDR) ) );
 822: 	ASSERT( IsWindowListViewControl( ((NMHDR *)lParam)->hwndFrom ) );
 823: 	ASSERT( NM_DBLCLK == ((NMHDR *)lParam)->code );
 824: 
 825: 	//
 826: 	const NMHDR *nmh = (NMHDR *)lParam; 
 827: 
 828: 	//
 829: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 830: 	{
 831: 		if ( g_ddx[ i ].list == _w64_static_cast<int>( nmh->idFrom ) ) // _W64
 832: 		{
 833: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
 834: 			{
 835: 				const int index = ListView_GetNextSelectedItem( nmh->hwndFrom, -1 );
 836: 				if ( 0 <= index )
 837: 				{
 838: 					char verb[ 1+MAX_CMDLINE ];
 839: 					ListView_GetItemText( nmh->hwndFrom, index, COLUMN_VERB, verb, numof(verb) ); 
 840: 
 841: 					char cmdline[ 1+MAX_CMDLINE ];
 842: 					make_cmdline( cmdline, numof(cmdline), verb );
 843: 					SetDlgItemText( hWnd, g_ddx[ i ].cmdline, cmdline );
 844: 					return true;
 845: 				}
 846: 
 847: 				// 項目以外を DBLCLICK した
 848: 				char cmdline[ 1+MAX_CMDLINE ];
 849: 				make_cmdline( cmdline, numof(cmdline), null );
 850: 				SetDlgItemText( hWnd, g_ddx[ i ].cmdline, cmdline );
 851: 				return true;
 852: 			}
 853: 		}
 854: 	}}
 855: 
 856: 	//
 857: 	UNREACHCODE( "g_ddx の抜け?" );
 858: 	return true;
 859: }//OnInstallNotifyVerbListDubleClick
 860: 
 861: //******************************************************************************************************************
 862: // private - init
 863: //******************************************************************************************************************
 864: //*********************************************************
 865: // InitInstallDlgSystemMenu
 866: //*********************************************************
 867: static
 868: bool
 869: InitInstallDlgSystemMenu
 870: 	(
 871: 		HWND hWnd
 872: 	)
 873: {
 874: 	// パラメタの仮定
 875: 	ASSERT( IsValidWindow( hWnd ) );
 876: 
 877: 	HMENU hmenuSystem = GetSystemMenu( hWnd, false );
 878: 	const int pos = GetMenuItemPos( hmenuSystem, SC_ZOOM );
 879: 	if ( 0 <= pos )
 880: 	{
 881: 		const struct 
 882: 			{
 883: 					  UINT  type;
 884: 					  UINT  id;
 885: 				const char *title;
 886: 			}
 887: 		item[] =
 888: 			{
 889: #define MAKE_MENUITEM( type, id, title ) { type, id, title }
 890: 				MAKE_MENUITEM( MF_SEPARATOR, 0,              null ),
 891: 				MAKE_MENUITEM( MF_STRING,    IDM_SETDEFAULT, "設定を初期値に戻す(&D)" ),
 892: 				MAKE_MENUITEM( MF_STRING,    IDM_ABOUT,      "About(&A)" ),
 893: 				MAKE_MENUITEM( MF_SEPARATOR, 0,              null ),
 894: 				MAKE_MENUITEM( MF_STRING,    IDM_USE_PIF,    "それでも *.pif ファイルに関連付ける" ),
 895: #undef MAKE_MENUITEM
 896: 			};
 897: 		{for( int i = numof( item ); 0 < i; --i )
 898: 		{
 899: 			VERIFY( InsertMenu( hmenuSystem, pos+1, MF_BYPOSITION | item[ i-1 ].type, item[ i-1 ].id, item[ i-1 ].title ) );
 900: 	//		Menu_InsertSeparator( hmenuSystem, pos+1, MF_BYPOSITION );
 901: 		}}
 902: 	}
 903: 
 904: 	return true;
 905: }//InitInstallDlgSystemMenu
 906: 
 907: 
 908: //******************************************************************************************************************
 909: // private
 910: //******************************************************************************************************************
 911: static bool SetInstallDlgDataVerbList( HWND hwndListView, const char *verb );
 912: 
 913: 
 914: //*********************************************************
 915: // ShowDlgItemGroup
 916: //*********************************************************
 917: static
 918: bool
 919: ShowDlgItemGroup
 920: 	(
 921: 		HWND hWnd,
 922: 		id_t id,
 923: 		bool bShow
 924: 	)
 925: {
 926: 	// パラメタの仮定
 927: 	ASSERT( IsValidWindow( hWnd ) );
 928: 	ASSERT( IS_VALID_ID( id ) );
 929: 
 930: 	{for( int index = 0; index < numof( g_ddx ); ++index )
 931: 	{
 932: 		if ( id == g_ddx[ index ].id )
 933: 		{
 934: 			//
 935: 			SetDlgItemText( hWnd, g_ddx[ index ].more, bShow ? "<< 詳細" : "詳細 >>" );
 936: 
 937: 			//
 938: 			{for( int i = 0; i < numof( g_offset ); ++i )
 939: 			{
 940: 				const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
 941: 				if ( (ctrl != g_ddx[ index ].check )
 942: 				  && (ctrl != g_ddx[ index ].more) )
 943: 				{
 944: 					if ( IsValidDlgItem( hWnd, ctrl ) )
 945: 					{
 946: 						VisibleDlgItem( hWnd, ctrl, bShow );
 947: 					}
 948: 				}
 949: 			}}
 950: 
 951: 			//
 952: 			const int sign = bShow ? 1 : -1;
 953: 			const int group_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].group );
 954: 			const int more_bottom  = GetDlgItemBottom( hWnd, g_ddx[ index ].more );
 955: 			const int height = sign * (group_bottom - more_bottom);
 956: 
 957: 			//
 958: 			{for( int i = 0; i < numof( g_ddx ); ++i )
 959: 			{
 960: 				if ( i != index )
 961: 				{
 962: 					if ( more_bottom < GetDlgItemTop( hWnd, g_ddx[ i ].group ) )
 963: 					{
 964: 						{for( int j = 0; j < numof( g_offset ); ++j )
 965: 						{
 966: 							const int ctrl = atoffset( int, &g_ddx[ i ], g_offset[ j ] );
 967: 							if ( IsValidDlgItem( hWnd, ctrl ) )
 968: 							{
 969: 								ShiftDlgItemPos( hWnd, ctrl, 0, height );
 970: 							}
 971: 						}}
 972: 					}
 973: 				}
 974: 			}}
 975: 
 976: 			//
 977: 			ShiftDlgItemPos( hWnd, IDOK,     0, height );
 978: 			ShiftDlgItemPos( hWnd, IDCANCEL, 0, height );
 979: 
 980: 			//
 981: 			g_dlg.szMinSize.cy += height;
 982: 			ShiftWindowSize( hWnd, 0, height );
 983: 		}
 984: 	}}
 985: 
 986: 	return true;
 987: }//ShowDlgItemGroup
 988: 
 989: //*********************************************************
 990: // EnableDlgItemGroup
 991: //*********************************************************
 992: static
 993: bool
 994: EnableDlgItemGroup
 995: 	(
 996: 		HWND hWnd,
 997: 		id_t id,
 998: 		bool bEnable
 999: 	)
1000: {
1001: 	// パラメタの仮定
1002: 	ASSERT( IsValidWindow( hWnd ) );
1003: 	ASSERT( IS_VALID_ID( id ) );
1004: 
1005: 	//
1006: 	{for( int index = 0; index < numof( g_ddx ); ++index )
1007: 	{
1008: 		if ( id == g_ddx[ index ].id )
1009: 		{
1010: 			{for( int i = 0; i < numof( g_offset ); ++i )
1011: 			{
1012: 				const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
1013: 				if ( (ctrl != g_ddx[ index ].check )
1014: 				  && (ctrl != g_ddx[ index ].more) )
1015: 				{
1016: 					if ( IsValidDlgItem( hWnd, ctrl ) )
1017: 					{
1018: 						EnableDlgItem( hWnd, ctrl, bEnable );
1019: 					}
1020: 				}
1021: 			}}
1022: 		}
1023: 	}}
1024: 
1025: 	return true;
1026: }//EnableDlgItemGroup
1027: 
1028: //*********************************************************
1029: // GetInstallDlgData
1030: //*********************************************************
1031: static
1032: bool
1033: GetInstallDlgData
1034: 	(
1035: 		HWND       hWnd,
1036: 		install_t *info
1037: 	)
1038: {
1039: 	// パラメタの仮定
1040: 	ASSERT( IsValidWindow( hWnd ) );
1041: 	ASSERT( IsValidPtr( info, sizeof( *info ) ) );
1042: 	DESTROY_BUFFER( info, sizeof( *info ) ); // [破壊]
1043: 
1044: 	// 関連づけ
1045: 	info->flags = 0;
1046: 	{for( int i = 0; i < numof( g_ddx ); ++i )
1047: 	{
1048: 		// check
1049: 		if ( IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
1050: 		{
1051: 			if ( BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ) )
1052: 			{
1053: 				info->flags |= g_ddx[ i ].flag;
1054: 			}
1055: 		}
1056: 		
1057: 		//
1058: 		{
1059: 			ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1060: 			const size_t index = ID_INDEX( g_ddx[ i ].id );
1061: 			ASSERT( IS_VALID_INDEX( index ) );
1062: 			relation_t *reg = &info->reg[ index ];
1063: 
1064: 			// default
1065: 			strcopy( reg->menu, numof(reg->menu), g_dlg.info.reg[ index ].menu );
1066: 			strcopy( reg->cmdline, numof(reg->cmdline), g_dlg.info.reg[ index ].cmdline );
1067: 			strcopy( reg->regpath, numof(reg->regpath), g_dlg.info.reg[ index ].regpath );
1068: 
1069: 			// regpath
1070: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
1071: 			{
1072: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath, numof( reg->regpath ) ) );
1073: 			}
1074: 			ASSERT( IsValidStringPtr( reg->regpath ) );
1075: 
1076: 			// menu
1077: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
1078: 			{
1079: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu, numof( reg->menu ) ) );
1080: 			}
1081: 			ASSERT( IsValidStringPtr( reg->menu ) );
1082: 
1083: 			// cmdline
1084: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
1085: 			{
1086: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline, numof( reg->cmdline ) ) );
1087: 			}
1088: 			ASSERT( IsValidCommandLineString( reg->cmdline ) );
1089: 		}
1090: 	}}
1091: 
1092: 	
1093: 	ASSERT( IsValidInstallInfo( info ) );
1094: 	return true;
1095: }//GetInstallDlgData
1096: 
1097: //*********************************************************
1098: // SetInstallDlgData
1099: //*********************************************************
1100: static
1101: bool
1102: SetInstallDlgData
1103: 	(
1104: 		      HWND       hWnd,
1105: 		const install_t *info
1106: 	)
1107: {
1108: 	// パラメタの仮定
1109: 	ASSERT( IsValidWindow( hWnd ) );
1110: 	ASSERT( IsValidInstallInfo( info ) );
1111: 
1112: 	// 
1113: 	{for( int i = 0; i < numof( g_ddx ); ++i )
1114: 	{
1115: 		// check
1116: 		const UINT uCheck = (g_ddx[ i ].flag == (info->flags & g_ddx[ i ].flag)) ? BST_CHECKED : BST_UNCHECKED;
1117: 		if ( ! IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
1118: 		{
1119: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, false );
1120: 		}
1121: 		else
1122: 		{
1123: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, BST_CHECKED == uCheck );
1124: 			CheckDlgButton( hWnd, g_ddx[ i ].check, uCheck );
1125: 		}
1126: 
1127: 		//
1128: 		{
1129: 			ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1130: 			const size_t index = ID_INDEX( g_ddx[ i ].id );
1131: 			ASSERT( IS_VALID_INDEX( index ) );
1132: 			const relation_t *reg = &info->reg[ index ];
1133: 			ASSERT( IsValidStringPtr( reg->menu ) );
1134: 			ASSERT( IsValidCommandLineString( reg->cmdline ) );
1135: 
1136: 			// regpath
1137: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
1138: 			{
1139: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath ) );
1140: 			}
1141: 
1142: 			// menu
1143: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
1144: 			{
1145: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu ) );
1146: 			}
1147: 
1148: 			// cmdline
1149: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
1150: 			{
1151: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline ) );
1152: 			}
1153: 
1154: 			// list
1155: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].list ) )
1156: 			{ 
1157: 				int argc;
1158: 				char **argv = argcargv( &argc, reg->cmdline, FLG_ARGCARGV_MSDEFAULT );
1159: 				if ( argv )
1160: 				{
1161: 					//
1162: 					char verb[ 1+MAX_CMDLINE ];
1163: 					get_cmdline_option( verb, numof( verb ), argc, argv );
1164: 
1165: 					//
1166: 					HWND hwndListView = GetDlgItem( hWnd, g_ddx[ i ].list );
1167: 					VERIFY( SetInstallDlgDataVerbList( hwndListView, verb ) );
1168: 
1169: 					//
1170: 					free_argcargv( argc, argv );
1171: 				}
1172: 			}
1173: 		}
1174: 	}}
1175: 
1176: 	return true;
1177: }//SetInstallDlgData
1178: 
1179: //*********************************************************
1180: // SetInstallDlgDataVerbList
1181: //*********************************************************
1182: static
1183: bool
1184: SetInstallDlgDataVerbList
1185: 	(
1186: 		      HWND  hwndListView,
1187: 		const char *verb
1188: 	)
1189: {
1190: 	// パラメタの仮定
1191: 	ASSERT( IsValidWindow( hwndListView ) );
1192: 	ASSERT( IsValidStringPtr( verb ) );
1193: 
1194: 	int index = -1;
1195: 	while( -1 != (index = ListView_GetNextItem(hwndListView, index, LVNI_ALL)) )
1196: 	{
1197: 		char title[ 1+MAX_CMDLINE ];
1198: 		ListView_GetItemText( hwndListView, index, COLUMN_VERB, title, numof(title) ); 
1199: 
1200: 		//
1201: 		ListView_SetItemState( hwndListView, index, (streql( verb, title ) ? LVIS_SELECTED : 0), LVIS_SELECTED ); 
1202: 	}
1203: 
1204: 	return true;
1205: }//SetInstallDlgDataVerbList
1206: 
1207: 
1208: //******************************************************************************************************************
1209: // private - init controls
1210: //******************************************************************************************************************
1211: static bool InitInstallDlgVerbListView( HWND hwndListView );
1212: static bool ListView_InsertVerb( HWND hwndListView, int index, const char *ver, const char *cmdline );
1213: 
1214: 
1215: //*********************************************************
1216: // InitInstallDlgControls
1217: //*********************************************************
1218: static
1219: bool
1220: InitInstallDlgControls
1221: 	(
1222: 		HWND  hWnd,
1223: 		DWORD more
1224: 	)
1225: {
1226: 	// パラメタの仮定
1227: 	ASSERT( IsValidWindow( hWnd ) );
1228: 
1229: 	//
1230: 	{for( int i = 0; i < numof( g_ddx ); ++i )
1231: 	{
1232: 		//
1233: 		VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (more & g_ddx[ i ].flag) ) );
1234: 
1235: 		//
1236: 		if ( IsValidDlgItem( hWnd, g_ddx[ i ].list ) )
1237: 		{
1238: 			HWND hwndVerbListView = GetDlgItem( hWnd, g_ddx[ i ].list );
1239: 			VERIFY( InitInstallDlgVerbListView( hwndVerbListView ) );
1240: 		}
1241: 	}}
1242: 
1243: 	// OnInstallSystemCommandUsePif(), OnInstallSystemCommandSetDefault() と重複している!
1244: 	// 関数名を考えよう!
1245: 	if ( g_dlg.pif )
1246: 	{
1247: 		VisibleDlgItem( hWnd, IDC_PIF,      true );
1248: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, true );
1249: 	}
1250: 	else
1251: 	{
1252: 		VisibleDlgItem( hWnd, IDC_PIF,      false );
1253: 		VisibleDlgItem( hWnd, IDC_MORE_PIF, false );
1254: 
1255: 		if ( FLAG_PIF == (g_dlg.more & FLAG_PIF) )
1256: 		{
1257: 			g_dlg.more ^= FLAG_PIF;
1258: 			VERIFY( ShowDlgItemGroup( hWnd, ID_PIF, FLAG_PIF == (FLAG_PIF & g_dlg.more) ) );
1259: 		}
1260: 	}
1261: 
1262: 	return true;
1263: }//InitInstallDlgControls
1264: 
1265: //*********************************************************
1266: // InitInstallDlgVerbListView
1267: //*********************************************************
1268: static
1269: bool
1270: InitInstallDlgVerbListView
1271: 	(
1272: 		HWND hwndListView
1273: 	)
1274: {
1275: 	// パラメタの仮定
1276: 	ASSERT( IsWindowListViewControl( hwndListView ) );
1277: 
1278: 	//
1279: 	ListView_SetExtendedStyle( hwndListView, LVS_EX_FULLROWSELECT );
1280: 	ListView_InsertNewColumn( hwndListView, COLUMN_VERB,    LVCF_FMT, LVCFMT_LEFT, COLUMN_WIDTH_VERB,    COLUMN_TITLE_VERB );
1281: 	ListView_InsertNewColumn( hwndListView, COLUMN_CMDLINE, LVCF_FMT, LVCFMT_LEFT, COLUMN_WIDTH_CMDLINE, COLUMN_TITLE_CMDLINE );
1282: 
1283: 	// フォルダに関連付けられた動詞を列挙 
1284: 	{
1285: 		HKEY hregShell;
1286: 		if ( OpenShellRegKey( REG_CLS_FOLDER, &hregShell ) )
1287: 		{
1288: 			char verb[ 1+MAX_CMDLINE ];
1289: 			{for( DWORD index = 0; EnumRegKey( hregShell, index, verb, numof(verb) ); ++index )
1290: 			{
1291: 				HKEY hregVerb;
1292: 				if ( OpenRegKey( hregShell, verb, KEY_ALL_ACCESS, &hregVerb ) )
1293: 				{
1294: 					HKEY hregCommand;
1295: 					if ( OpenRegKey( hregVerb, REG_KEYNAME_COMMAND, KEY_ALL_ACCESS, &hregCommand ) )
1296: 					{
1297: 						char cmdln[ 1+MAX_CMDLINE ];
1298: 						if ( GetRegKeyString( hregCommand, null, cmdln, numof(cmdln) ) )
1299: 						{
1300: 							VERIFY( ListView_InsertVerb( hwndListView, 0, verb, cmdln ) );
1301: 						}
1302: 						VERIFY( CloseRegKey( hregCommand ) );
1303: 					}
1304: 					VERIFY( CloseRegKey( hregVerb ) );
1305: 				}
1306: 			}}
1307: 			VERIFY( CloseRegKey( hregShell ) );
1308: 		}
1309: 	}
1310: 
1311: 	return true;
1312: }//InitInstallDlgVerbListView
1313: 
1314: //*********************************************************
1315: // ListView_InsertVerb
1316: //*********************************************************
1317: static
1318: bool
1319: ListView_InsertVerb
1320: 	(
1321: 		      HWND  hwndListView,
1322: 		      int   index,
1323: 		const char *verb,
1324: 		const char *cmdln
1325: 	)
1326: {
1327: 	// パラメタの仮定
1328: 	ASSERT( 0 <= index );
1329: 	ASSERT( IsWindowListViewControl( hwndListView ) );
1330: 	ASSERT( IsValidStringPtr( verb ) );
1331: 	ASSERT( IsValidStringPtr( cmdln ) );
1332: 
1333: 	LVITEM lvItem;
1334: 	lvItem.mask     = 0;
1335: 	lvItem.iItem    = index;
1336: 	lvItem.iSubItem = 0;
1337: 	ListView_InsertItem( hwndListView, &lvItem );
1338: 	ListView_SetItemText( hwndListView, index, COLUMN_VERB,    const_cast<char *>( verb ) );
1339: 	ListView_SetItemText( hwndListView, index, COLUMN_CMDLINE, const_cast<char *>( cmdln ) );
1340: 
1341: 	return true;
1342: }//ListView_InsertVerb
1343: 
1344: //*********************************************************
1345: // ListView_GetNextSelectedItem
1346: //*********************************************************
1347: static
1348: int
1349: ListView_GetNextSelectedItem
1350: 	(
1351: 		HWND hwndListView,
1352: 		int  index
1353: 	)
1354: {
1355: 	// パラメタの仮定
1356: 	ASSERT( IsWindowListViewControl( hwndListView ) );
1357: 
1358: 	return ListView_GetNextItem( hwndListView, index, LVNI_ALL | LVNI_SELECTED );
1359: }//ListView_GetNextSelectedItem
1360: 
1361: 
1362: //******************************************************************************************************************
1363: // TEST
1364: //******************************************************************************************************************
1365: 
1366: 
1367: #ifdef _DEBUG // デバッグ時のみ
1368: 
1369: 
1370: //*********************************************************
1371: // test_InstallDlg
1372: //*********************************************************
1373: DEFINE_TESTPROC( test_InstallDlg )
1374: {
1375: 	//---------------------------------------------------------
1376: 	// 定数 の テスト
1377: 	//---------------------------------------------------------
1378: 
1379: 	// g_offset の 重複
1380: 	{for( int i = 0; i < numof( g_offset ) - 1; ++i )
1381: 	{
1382: 		{for( int j = i+1; j < numof( g_offset ); ++j )
1383: 		{
1384: 			ASSERT( i != j );
1385: 			ASSERT( g_offset[ i ] != g_offset[ j ] );
1386: 		}}
1387: 	}}
1388: 
1389: 	// g_ddx の 範囲
1390: 	{for( int i = 0; i < numof( g_ddx ); ++i )
1391: 	{
1392: 		ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1393: //		ASSERT( (0 <= g_ddx[i].id) && (g_ddx[i].id < numof( ((install_t *)null)->reg )) );
1394: 	}}
1395: 
1396: 	// g_ddx の 重複
1397: 	{for( int i = 0; i < numof( g_ddx ) - 1; ++i )
1398: 	{
1399: 		{for( int j = i+1; j < numof( g_ddx ); ++j )
1400: 		{
1401: 			ASSERT( i != j );
1402: 			ASSERT( g_ddx[ i ].id != g_ddx[ j ].id );
1403: 			ASSERT( 0 == (g_ddx[ i ].flag & g_ddx[ j ].flag) );
1404: 
1405: 			{for( int k = 0; k < numof( g_offset ); ++k )
1406: 			{
1407: 				const int ctrl_i = atoffset( int, &g_ddx[ i ], g_offset[ k ] );
1408: 				const int ctrl_j = atoffset( int, &g_ddx[ j ], g_offset[ k ] );
1409: 				ASSERT( ctrl_i != ctrl_j );
1410: 			}}
1411: 		}}
1412: 	}}
1413: 
1414: 
1415: 	//---------------------------------------------------------
1416: 	// ファイルスコープ関数 の テスト
1417: 	//---------------------------------------------------------
1418: 
1419: 	//---------------------------------------------------------
1420: 	// 公開関数 の テスト
1421: 	//---------------------------------------------------------
1422: 
1423: }//test_InstallDlg
1424: 
1425: 
1426: #endif // #ifdef _DEBUG
1427: 
1428: 
1429: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > atlnk > custom.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/atlnk/custom_cpp.shtml
『新妻LOVELY×CATION』を応援しています!